package com.gopay.common.user.dao;

import java.io.Serializable;
import java.util.List;

import com.gopay.common.base.dao.BaseDAO;
import com.gopay.common.domain.cloud.CloudCustAcctRel;
import com.gopay.common.domain.cps.CpsGenMainOrder;

/**
 * 
 * ZhangZG
 * 2015年12月29日 
 * www.gopay.com.cn Inc.All rights reserved.
 */
public interface CloudCustAcctRelDao extends BaseDAO<CloudCustAcctRel, Serializable> {
	
	/**
	 * 根据平台客户号和子公司帐号获取关联实体
	 * @param partnerCustId  平台custId
	 * @param acctId  子公司账户
	 */
	public CloudCustAcctRel findCloudCustAcctRelByAcct(String partnerCustId,String acctId);
	/**
	 * 根据子公司客户号和子公司的唯一Id现为邮箱获取关联实体
	 * @param custId  子公司custId
	 * @param partnerUserId  子公司账户
	 */
	public CloudCustAcctRel findCloudCustAcctRelByUserId(String custId,String partnerUserId);
	/**
	 * 根据采购部客户号和子公司的唯一Id现为邮箱获取关联实体
	 * @param partnerCustId  平台custId
	 * @param partnerUserId  邮箱
	 */
	public CloudCustAcctRel findCloudPaCustAcctRelByUserId(String partnerCustId,String partnerUserId);
	/**
	 * 根据平台与客户协议号获得关联关系
	 * @param agreeId  与平台协议号
	 */	
	public CloudCustAcctRel findCloudCustAcctRelByAgreeId(String agreeId);
	/**
	 * 根据合作方客户号、合作方账户号和用户协议号确定唯一关联实体
	 * @param partnerCustId  平台custId
	 * @param partnerAcctId  平台账户
	 * @param agreeId  协议号
	 */	
	public CloudCustAcctRel findCustAcctRelByAcctIdCustIdAndAgreeId(String partnerCustId,String partnerAcctId,String agreeId);
	/**
	 * 根据合作方账户号和用户Id确定唯一关联实体
	 * @param partnerAcctId  平台账户
	 * @param mobileOrEmail  用户手机或邮箱
	 */	
	public CloudCustAcctRel findCustAcctRelByAcctIdAndUserMob(String partnerAcctId,String mobileOrEmail);

	/**
	 * 生钱包 根据合作方客户号、合作方商户的客户号确认唯一关联实体
	 * @param partnerCustId
	 * @param custId
	 * @return
	 */
	public CloudCustAcctRel findCustAcctRelByPartnerCustIdAndCustId(String partnerCustId, String custId, String transferOutAcctId, String transferInAcctId);
	/**
	 * 根据平台custId、子custId、子账户号确定唯一关联实体
	 * @param partnerCustId  平台custId
	 * @param partnerAcctId  平台账户
	 * @param custId  子custId
	 * @param acctId  子账户号
	 */
	public CloudCustAcctRel findCustAcctRelByAcctIdCustIdNew(String partnerCustId,String partnerAcctId,String custId,String acctId);
	/**
	 * 根据合作方客户号，合作方商户的客户号确定唯一关联实体
	 * @param custId
	 * @param partnerCustId
	 * @return
	 */
	public CloudCustAcctRel findCustAcctRelByCustIdAndPartnerCustId(String custId,String partnerCustId);
	/**
	 * 根据参数获取平台acctId
	 * 获取账户分为2种，一：来至于网关的，此时merId为平台账户    子公司发起
	 * 			      二：来至于portal的，此时merId为国付宝系统MerID=GFB0000001   平台自己发起
	 * @param cloudCustId 云账户custID
	 * @param acctId 子公司acctId
	 * @return 平台账户号
	 */
	public String getCloudAcct(CpsGenMainOrder mainOrder);
	
	public String getCloudCustId(CpsGenMainOrder mainOrder);
	/**
	 * 根据子账户acctId和总账户custId，查询云账户总账户的acctId
	 * @Description 
	 * @param acctId   子账户acctId
	 * @param merId    总账户custId
	 * @return 
	 * @author jiaoshuai
	 */
	public String getCloudAcct(String acctId,String merId);


	/**
	 * 根据协议号和关联平台custId唯一确定一个关联实体
	 * @param agreeId 协议号
	 * @param partnerCustId 关联平台custId
	 * @return 关联实体
	 */
	CloudCustAcctRel findCustAcctRealByAgreeIdAndPartnerCustId(String agreeId,String partnerCustId);


	/**
	 * 根据子账户账号和关联平台custId唯一确定一个关联实体
	 * @param partnerUserId 子账号账号
	 * @param partnerCustId 关联平台custId
	 * @return 关联实体
	 */
	CloudCustAcctRel findCustAcctRealByPartnerUserIdAndPartnerCustId(String partnerUserId,String partnerCustId);

	List<CloudCustAcctRel> findCloudCustAcctRelList(String custId);

	/**
	 * 根据子账户custId查询关联关系
	 * @param custId
	 * @return
	 */
	CloudCustAcctRel findByCustId(String custId);
	
	/**
	 * @Description: 查询总账户下的所有子账户
	 * @param partnerCustId
	 * @param partnerAcctId
	 * @return 
	 * @author liuxuyang
	 */
	List<CloudCustAcctRel> findSubCloudAccts(String partnerCustId,String partnerAcctId);
}
